package com.cencat.product.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.cencat.common.exception.BusinessException;
import com.cencat.product.dto.ProductCreateDTO;
import com.cencat.product.dto.ProductQueryDTO;
import com.cencat.product.dto.ProductUpdateDTO;
import com.cencat.product.entity.Product;
import com.cencat.product.vo.ProductVO;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * 产品服务接口
 * 
 * @author cencat
 * @since 2024-01-01
 */
public interface ProductService {

    /**
     * 创建产品
     * 
     * @param dto 产品创建DTO
     * @return 产品ID
     * @throws BusinessException 业务异常
     */
    Long createProduct(ProductCreateDTO dto) throws BusinessException;

    /**
     * 更新产品
     * 
     * @param dto 产品更新DTO
     * @return 是否成功
     * @throws BusinessException 业务异常
     */
    Boolean updateProduct(ProductUpdateDTO dto) throws BusinessException;

    /**
     * 删除产品
     * 
     * @param id 产品ID
     * @return 是否成功
     * @throws BusinessException 业务异常
     */
    Boolean deleteProduct(Long id) throws BusinessException;

    /**
     * 批量删除产品
     * 
     * @param ids 产品ID列表
     * @return 是否成功
     * @throws BusinessException 业务异常
     */
    Boolean batchDeleteProducts(List<Long> ids) throws BusinessException;

    /**
     * 根据ID查询产品
     * 
     * @param id 产品ID
     * @return 产品信息
     * @throws BusinessException 业务异常
     */
    Product getProductById(Long id) throws BusinessException;

    /**
     * 根据产品编码查询产品
     * 
     * @param productCode 产品编码
     * @return 产品信息
     * @throws BusinessException 业务异常
     */
    Product getProductByCode(String productCode) throws BusinessException;

    /**
     * 查询产品详情
     * 
     * @param id 产品ID
     * @return 产品详情VO
     * @throws BusinessException 业务异常
     */
    ProductVO getProductDetail(Long id) throws BusinessException;

    /**
     * 分页查询产品列表
     * 
     * @param queryDTO 查询条件
     * @return 产品分页列表
     * @throws BusinessException 业务异常
     */
    IPage<ProductVO> getProductPage(ProductQueryDTO queryDTO) throws BusinessException;

    /**
     * 查询产品列表
     * 
     * @param queryDTO 查询条件
     * @return 产品列表
     * @throws BusinessException 业务异常
     */
    List<ProductVO> getProductList(ProductQueryDTO queryDTO) throws BusinessException;

    /**
     * 上架产品
     * 
     * @param id 产品ID
     * @return 是否成功
     * @throws BusinessException 业务异常
     */
    Boolean onShelfProduct(Long id) throws BusinessException;

    /**
     * 下架产品
     * 
     * @param id 产品ID
     * @return 是否成功
     * @throws BusinessException 业务异常
     */
    Boolean offShelfProduct(Long id) throws BusinessException;

    /**
     * 批量上架产品
     * 
     * @param ids 产品ID列表
     * @return 是否成功
     * @throws BusinessException 业务异常
     */
    Boolean batchOnShelfProducts(List<Long> ids) throws BusinessException;

    /**
     * 批量下架产品
     * 
     * @param ids 产品ID列表
     * @return 是否成功
     * @throws BusinessException 业务异常
     */
    Boolean batchOffShelfProducts(List<Long> ids) throws BusinessException;

    /**
     * 审核产品
     * 
     * @param id 产品ID
     * @param auditStatus 审核状态
     * @param auditRemark 审核备注
     * @return 是否成功
     * @throws BusinessException 业务异常
     */
    Boolean auditProduct(Long id, Product.AuditStatus auditStatus, String auditRemark) throws BusinessException;

    /**
     * 批量审核产品
     * 
     * @param ids 产品ID列表
     * @param auditStatus 审核状态
     * @param auditRemark 审核备注
     * @return 是否成功
     * @throws BusinessException 业务异常
     */
    Boolean batchAuditProducts(List<Long> ids, Product.AuditStatus auditStatus, String auditRemark) throws BusinessException;

    /**
     * 更新产品库存
     * 
     * @param id 产品ID
     * @param stockQuantity 库存数量
     * @return 是否成功
     * @throws BusinessException 业务异常
     */
    Boolean updateProductStock(Long id, Integer stockQuantity) throws BusinessException;

    /**
     * 增加产品库存
     * 
     * @param id 产品ID
     * @param quantity 增加数量
     * @return 是否成功
     * @throws BusinessException 业务异常
     */
    Boolean increaseProductStock(Long id, Integer quantity) throws BusinessException;

    /**
     * 减少产品库存
     * 
     * @param id 产品ID
     * @param quantity 减少数量
     * @return 是否成功
     * @throws BusinessException 业务异常
     */
    Boolean decreaseProductStock(Long id, Integer quantity) throws BusinessException;

    /**
     * 更新产品销售数量
     * 
     * @param id 产品ID
     * @param salesCount 销售数量
     * @return 是否成功
     * @throws BusinessException 业务异常
     */
    Boolean updateProductSalesCount(Long id, Integer salesCount) throws BusinessException;

    /**
     * 更新产品浏览数量
     * 
     * @param id 产品ID
     * @return 是否成功
     * @throws BusinessException 业务异常
     */
    Boolean updateProductViewCount(Long id) throws BusinessException;

    /**
     * 更新产品收藏数量
     * 
     * @param id 产品ID
     * @param favoriteCount 收藏数量变化（正数增加，负数减少）
     * @return 是否成功
     * @throws BusinessException 业务异常
     */
    Boolean updateProductFavoriteCount(Long id, Integer favoriteCount) throws BusinessException;

    /**
     * 更新产品评分
     * 
     * @param id 产品ID
     * @param rating 评分
     * @param commentCount 评论数量
     * @return 是否成功
     * @throws BusinessException 业务异常
     */
    Boolean updateProductRating(Long id, BigDecimal rating, Integer commentCount) throws BusinessException;

    /**
     * 查询推荐产品列表
     * 
     * @param limit 限制数量
     * @return 推荐产品列表
     * @throws BusinessException 业务异常
     */
    List<ProductVO> getRecommendedProducts(Integer limit) throws BusinessException;

    /**
     * 查询热销产品列表
     * 
     * @param limit 限制数量
     * @return 热销产品列表
     * @throws BusinessException 业务异常
     */
    List<ProductVO> getHotProducts(Integer limit) throws BusinessException;

    /**
     * 查询新品列表
     * 
     * @param limit 限制数量
     * @return 新品列表
     * @throws BusinessException 业务异常
     */
    List<ProductVO> getNewProducts(Integer limit) throws BusinessException;

    /**
     * 查询特价产品列表
     * 
     * @param limit 限制数量
     * @return 特价产品列表
     * @throws BusinessException 业务异常
     */
    List<ProductVO> getSpecialProducts(Integer limit) throws BusinessException;

    /**
     * 根据商家ID查询产品列表
     * 
     * @param merchantId 商家ID
     * @return 产品列表
     * @throws BusinessException 业务异常
     */
    List<ProductVO> getProductsByMerchantId(Long merchantId) throws BusinessException;

    /**
     * 根据分类ID查询产品列表
     * 
     * @param categoryId 分类ID
     * @return 产品列表
     * @throws BusinessException 业务异常
     */
    List<ProductVO> getProductsByCategoryId(Long categoryId) throws BusinessException;

    /**
     * 根据品牌ID查询产品列表
     * 
     * @param brandId 品牌ID
     * @return 产品列表
     * @throws BusinessException 业务异常
     */
    List<ProductVO> getProductsByBrandId(Long brandId) throws BusinessException;

    /**
     * 根据价格区间查询产品列表
     * 
     * @param minPrice 最低价格
     * @param maxPrice 最高价格
     * @return 产品列表
     * @throws BusinessException 业务异常
     */
    List<ProductVO> getProductsByPriceRange(BigDecimal minPrice, BigDecimal maxPrice) throws BusinessException;

    /**
     * 搜索产品
     * 
     * @param keyword 关键词
     * @param limit 限制数量
     * @return 产品列表
     * @throws BusinessException 业务异常
     */
    List<ProductVO> searchProducts(String keyword, Integer limit) throws BusinessException;

    /**
     * 查询相关产品
     * 
     * @param productId 产品ID
     * @param limit 限制数量
     * @return 相关产品列表
     * @throws BusinessException 业务异常
     */
    List<ProductVO> getRelatedProducts(Long productId, Integer limit) throws BusinessException;

    /**
     * 查询即将过期的产品
     * 
     * @param days 天数
     * @return 即将过期的产品列表
     * @throws BusinessException 业务异常
     */
    List<ProductVO> getExpiringProducts(Integer days) throws BusinessException;

    /**
     * 查询已过期的产品
     * 
     * @return 已过期的产品列表
     * @throws BusinessException 业务异常
     */
    List<ProductVO> getExpiredProducts() throws BusinessException;

    /**
     * 查询库存不足的产品
     * 
     * @return 库存不足的产品列表
     * @throws BusinessException 业务异常
     */
    List<ProductVO> getLowStockProducts() throws BusinessException;

    /**
     * 查询售罄的产品
     * 
     * @return 售罄的产品列表
     * @throws BusinessException 业务异常
     */
    List<ProductVO> getSoldOutProducts() throws BusinessException;

    /**
     * 统计产品总数
     * 
     * @return 产品总数
     * @throws BusinessException 业务异常
     */
    Long countTotalProducts() throws BusinessException;

    /**
     * 根据状态统计产品数量
     * 
     * @param status 产品状态
     * @return 产品数量
     * @throws BusinessException 业务异常
     */
    Long countProductsByStatus(Product.ProductStatus status) throws BusinessException;

    /**
     * 根据产品类型统计产品数量
     * 
     * @param productType 产品类型
     * @return 产品数量
     * @throws BusinessException 业务异常
     */
    Long countProductsByType(Product.ProductType productType) throws BusinessException;

    /**
     * 根据审核状态统计产品数量
     * 
     * @param auditStatus 审核状态
     * @return 产品数量
     * @throws BusinessException 业务异常
     */
    Long countProductsByAuditStatus(Product.AuditStatus auditStatus) throws BusinessException;

    /**
     * 统计库存不足的产品数量
     * 
     * @return 库存不足产品数量
     * @throws BusinessException 业务异常
     */
    Long countLowStockProducts() throws BusinessException;

    /**
     * 统计售罄产品数量
     * 
     * @return 售罄产品数量
     * @throws BusinessException 业务异常
     */
    Long countSoldOutProducts() throws BusinessException;

    /**
     * 查询商家产品统计信息
     * 
     * @param merchantId 商家ID
     * @return 统计信息
     * @throws BusinessException 业务异常
     */
    Map<String, Object> getMerchantProductStats(Long merchantId) throws BusinessException;

    /**
     * 查询分类产品统计信息
     * 
     * @param categoryId 分类ID
     * @return 统计信息
     * @throws BusinessException 业务异常
     */
    Map<String, Object> getCategoryProductStats(Long categoryId) throws BusinessException;

    /**
     * 查询品牌产品统计信息
     * 
     * @param brandId 品牌ID
     * @return 统计信息
     * @throws BusinessException 业务异常
     */
    Map<String, Object> getBrandProductStats(Long brandId) throws BusinessException;

    /**
     * 查询产品销售统计
     * 
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 销售统计
     * @throws BusinessException 业务异常
     */
    List<Map<String, Object>> getProductSalesStats(LocalDateTime startTime, LocalDateTime endTime) throws BusinessException;

    /**
     * 查询产品库存统计
     * 
     * @return 库存统计
     * @throws BusinessException 业务异常
     */
    Map<String, Object> getProductStockStats() throws BusinessException;

    /**
     * 生成产品编码
     * 
     * @param prefix 编码前缀
     * @return 产品编码
     * @throws BusinessException 业务异常
     */
    String generateProductCode(String prefix) throws BusinessException;

    /**
     * 检查产品编码是否存在
     * 
     * @param productCode 产品编码
     * @param excludeId 排除的产品ID
     * @return 是否存在
     * @throws BusinessException 业务异常
     */
    Boolean checkProductCodeExists(String productCode, Long excludeId) throws BusinessException;

    /**
     * 检查产品名称是否存在
     * 
     * @param productName 产品名称
     * @param excludeId 排除的产品ID
     * @return 是否存在
     * @throws BusinessException 业务异常
     */
    Boolean checkProductNameExists(String productName, Long excludeId) throws BusinessException;

    /**
     * 导出产品数据
     * 
     * @param queryDTO 查询条件
     * @return 导出文件路径
     * @throws BusinessException 业务异常
     */
    String exportProducts(ProductQueryDTO queryDTO) throws BusinessException;

    /**
     * 导入产品数据
     * 
     * @param filePath 文件路径
     * @return 导入结果
     * @throws BusinessException 业务异常
     */
    Map<String, Object> importProducts(String filePath) throws BusinessException;

    /**
     * 复制产品
     * 
     * @param id 原产品ID
     * @param newProductName 新产品名称
     * @param newProductCode 新产品编码
     * @return 新产品ID
     * @throws BusinessException 业务异常
     */
    Long copyProduct(Long id, String newProductName, String newProductCode) throws BusinessException;

    /**
     * 设置产品推荐状态
     * 
     * @param id 产品ID
     * @param isRecommended 是否推荐
     * @return 是否成功
     * @throws BusinessException 业务异常
     */
    Boolean setProductRecommended(Long id, Boolean isRecommended) throws BusinessException;

    /**
     * 设置产品热销状态
     * 
     * @param id 产品ID
     * @param isHot 是否热销
     * @return 是否成功
     * @throws BusinessException 业务异常
     */
    Boolean setProductHot(Long id, Boolean isHot) throws BusinessException;

    /**
     * 设置产品新品状态
     * 
     * @param id 产品ID
     * @param isNew 是否新品
     * @return 是否成功
     * @throws BusinessException 业务异常
     */
    Boolean setProductNew(Long id, Boolean isNew) throws BusinessException;

    /**
     * 设置产品特价状态
     * 
     * @param id 产品ID
     * @param isSpecial 是否特价
     * @return 是否成功
     * @throws BusinessException 业务异常
     */
    Boolean setProductSpecial(Long id, Boolean isSpecial) throws BusinessException;

    /**
     * 批量更新产品状态
     * 
     * @param ids 产品ID列表
     * @param status 产品状态
     * @return 是否成功
     * @throws BusinessException 业务异常
     */
    Boolean batchUpdateProductStatus(List<Long> ids, Product.ProductStatus status) throws BusinessException;

    /**
     * 批量更新产品价格
     * 
     * @param ids 产品ID列表
     * @param salePrice 销售价格
     * @param marketPrice 市场价格
     * @return 是否成功
     * @throws BusinessException 业务异常
     */
    Boolean batchUpdateProductPrice(List<Long> ids, BigDecimal salePrice, BigDecimal marketPrice) throws BusinessException;

    /**
     * 批量更新产品分类
     * 
     * @param ids 产品ID列表
     * @param categoryId 分类ID
     * @return 是否成功
     * @throws BusinessException 业务异常
     */
    Boolean batchUpdateProductCategory(List<Long> ids, Long categoryId) throws BusinessException;

    /**
     * 批量更新产品品牌
     * 
     * @param ids 产品ID列表
     * @param brandId 品牌ID
     * @return 是否成功
     * @throws BusinessException 业务异常
     */
    Boolean batchUpdateProductBrand(List<Long> ids, Long brandId) throws BusinessException;
}